<?php
/**
 * Controller_Base
 * @author sayp
 * Базовый контроллер
 */
abstract class Controller_Base {
	
	protected $title = ''; 						// Заголовок страницы
	protected $keywords = ''; 				// Ключевые слова страницы
	protected $description = ''; 			// Описание страницы
	protected $bodyAttr = '';					// Атрибут body
	protected $pageHead = '';					// Заголовок страницы(h1)
	
	protected $showLeft = true; 				// Показывать ли левый столбец
	protected $showRight = false; 				// Показывать ли правый столбец
	protected $showPrepPage = false;
	protected $arrRequest = array(); 			// Массив урлов
	protected $error = 0; 						// Номер ошибки
	protected $arrCss = array();
	protected $arrJs = array(); 
	protected $arrCrumbs = array();				// Массив хлебных крошек
	protected $ifLastCrumbIsLink = false;		// Флаг покакза последней хлебной крошки
	protected $jsReady; 						// JS-код, который будет автоматически вызван при загрузке страницы
	protected $isNoindex = false;				// Флаг, закрывать ли страницу от индексации
	
	protected $cssJsDescription = 'css_js.php';
	
	/**
	 * Конструктор базового класса
	 * @param array $arrRequest - массив урлов
	 */
	public function __construct(&$arrRequest) {
		$this->arrRequest = $arrRequest;
	}
	
	
	/**
	 * Устанавливаем номер ошибки
	 * @author Mike
	 */
	public function setError($errorNumber) {
		$this->error = $errorNumber;
	}
	
	/**
	 * Метод добавляет очередную хлебную крошку к общему массиву
	 *
	 * @param string - имя хлебной крошки
	 * @pararm string $url - адрес крошки
	 * @pararm bool $noLinkIfLast - флаг, не показывать как ссылку, если крошка последняя
	 */
	public function addCrumb($name, $url = null, $noLinkIfLast = false, $isNoindex = false) {
		$arrCrumb = array();
		$arrCrumb['name'] = $name;
		$arrCrumb['url'] = $url;
		$arrCrumb['no_link_if_last'] = $noLinkIfLast;
		$arrCrumb['is_noindex'] = $isNoindex;
		$this->arrCrumbs[] = $arrCrumb;
	}
	
	/**
	 * Метод выводит сообщение об ошибке и записывает ошибку в БД
	 * @author Mike
	 */
	public function showError() {
		//$objError = new Model_Error();
		//$objError->setFields(array('error_name' => 'Site error ' . $this->error,'error_url' => $_SERVER['REQUEST_URI']));
		//$objError->save();
	
		switch ($this->error) {
			case 404:
				header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
				View_Error::showErrorPage('404');
				break;
			case 403:
				header($_SERVER["SERVER_PROTOCOL"]." 403 Forbidden");
				View_Error::showErrorPage('403');
				break;
			case 503:
				header($_SERVER["SERVER_PROTOCOL"]." 503 Service Unavailable");
				View_Error::showErrorPage('503');
				break;
		}
	}
	
	/**
	 * Выводим мета-данные
	 */
	protected function showMetas() {
		echo '<meta charset="utf-8" />';
		if ($this->isNoindex) echo '<meta name="robots" content="noindex" />';
		if ($this->keywords) echo '<meta name="keywords" content="' . $this->keywords . '" />';
		if ($this->description) echo '<meta name="description" content="' . $this->description . '" />';
	}
	
	/**
	 * Метод отображает верхнюю часть страницы
	 */
	protected function showHeader() {
		echo '<!DOCTYPE html>';
		echo '<!--[if lt IE 7 ]><html lang="ru" class="ie ie6"><![endif]-->';
		echo '<!--[if IE 7 ]><html lang="ru" class="ie ie7"><![endif]-->';
		echo '<!--[if IE 8 ]><html lang="ru" class="ie ie8"><![endif]-->';
		echo '<!--[if IE 9 ]><html lang="ru" class="ie ie9"><![endif]-->';
		echo '<!--[if (gt IE 9)|!(IE)]><!--><html lang="ru"><!--<![endif]-->';
		echo '<head>';
			echo '<title>' . $this->title . '</title>';
			$this->showMetas();
			echo '<link rel="shortcut icon" href="/content/images/icons/favicon.ico" type="image/x-icon" />';
			
			echo Service_Generate::generateJsCssTags($this->cssJsDescription);
			
			foreach ($this->arrCss as $cssFile)	echo '<link rel="stylesheet" type="text/css" href="' . W_CSS . $cssFile . '" />';
			foreach ($this->arrJs as $jsFile) echo '<script type="text/javascript" src="' . W_JS . $jsFile . '"></script>' . "\n";
			
		echo '</head>';
		echo '<body' . ($this->bodyAttr ? ' class="' . $this->bodyAttr . '"' : null) . '>';
		echo '<div id="all">';
			echo '<div class="header-line"></div>';
			echo '<div id="all-in">';
			$this->showTop();
			
			
		echo '<div id="middle">';
		if ($this->showPrepPage) $this->showPrepPage();
		if ($this->showLeft) $this->showLeft();
		if ($this->showRight) $this->showRight();
		echo '<div id="content"' . ($this->showLeft ? ' class="with-left"' : null) . '>';
			// Вывод хлебных крошек
			if ($this->arrCrumbs) {
				$this->showCrumbs();
			}
		if($this->pageHead) echo '<h1 class="page-head">' . $this->pageHead . '</h1>';
	}
	
	
	/**
	 * Левый столбец
	 */
	protected function showLeft() {
		$objCategory = new Category();
		$arrCategories = $objCategory->find('all', array('order' => '`category`.`category_name`'));
		$arrCategories = Category::getCategoriesTree($arrCategories);
		$arrActiveCategoriesIds = !empty($this->arrActiveCategoriesIds) ? $this->arrActiveCategoriesIds : array();
		
		View_Block::showLeft($arrCategories, $arrActiveCategoriesIds);
	}
	
	/**
	 * Правый столбец
	 */
	protected function showRight() {
		echo '<div id="right">';
		echo '</div>';
	}
	
	public function showTop() {
		$cartContent = Cart::getCartContentShort();
		View_Block::showHeader($cartContent);
	}
	
	/**
	 * Подвал
	 */
	protected function showFooter() {
		echo '</div>'; // Закрываем content
		if ($this->showLeft) echo '<div class="clear"></div>';
		echo '</div>'; // Закрываем middle
		echo '<div id="footer-height"></div>';
		echo '</div>'; // Закрываем all-in
		echo '</div>'; // Закрываем all
		View_Block::showFooter();
		
		if(DOMAIN == 'wearland.ru') {?><!-- Yandex.Metrika counter --><script src="//mc.yandex.ru/metrika/watch.js" type="text/javascript"></script><script type="text/javascript">try { var yaCounter22355467 = new Ya.Metrika({id:22355467, webvisor:true, clickmap:true, trackLinks:true, accurateTrackBounce:true}); } catch(e) { }</script><noscript><div><img src="//mc.yandex.ru/watch/22355467" style="position:absolute; left:-9999px;" alt="" /></div></noscript><!-- /Yandex.Metrika counter --><script type="text/javascript">var _gaq = _gaq || [];_gaq.push(['_setAccount', 'UA-44557306-1']);_gaq.push(['_trackPageview']);(function() {var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);})();</script><?php }
		if (isset($_SESSION['message'])) {
			echo "<script stype=\"text/javascript\">App." . ($_SESSION['message']['is_error'] ? 'showError' : 'showMessage') . "('" . $_SESSION['message']['text'] . "');</script>";
			unset($_SESSION['message']);
		}
		echo '</body>';
		echo '</html>';
	}
	
	/**
	 * Метод выводит хлебные крошки
	 *
	 */
	public function showCrumbs() {
		View_Block::showCrumbs($this->arrCrumbs, true);
	}
}
?>